home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / makebin.com / MAKEBIN.PRN < prev    next >
Encoding:
Text File  |  1989-04-16  |  20.6 KB  |  402 lines

  1. 0000                       0001 
  2. 0000                       0002 ;MAKEBIN HEADER; COMPILE WITH SEATTLE ASSEMBLER
  3. 0000                       0003 ;MAKEBIN HEADER  V1.01  Copyright 1989  Michael Day   as of 16 April 1989
  4. 0000                       0004 
  5. 0000                       0005 FILSIZE EQU 2
  6. 0000                       0006 ITEMCNT    EQU 6
  7. 0000                       0007 HDRSIZE    EQU 8
  8. 0000                       0008 STKSEG    EQU 0EH
  9. 0000                       0009 STKOFF    EQU 10H
  10. 0000                       0010 CODEOFF    EQU 14H
  11. 0000                       0011 CODESEG    EQU 16H
  12. 0000                       0012 RELITEM    EQU 18H
  13. 0000                       0013 
  14. 0000                       0014 ;FLAGS,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP,SP,SS
  15. 0000                       0015 
  16. 0000                       0016     ORG 0        ;WE ASSUME THAT WE WILL BE LOADED 
  17. 0000                       0017 ENTRY:            ;ON A SEGMENT BOUNDRY
  18. 0000 2E                    0018     SEG CS
  19. 0001 8C 1E A9 02           0019     MOV [OLDDS],DS    ;SAVE CURRENT DS
  20. 0005 0E                    0020     PUSH CS        ;THEN UPDATE IT TO OUR CS
  21. 0006 1F                    0021     POP DS
  22. 0007 8C 16 B1 02           0022     MOV [OLDSS],SS
  23. 000B 89 26 AF 02           0023     MOV [OLDSP],SP
  24. 000F 89 2E AD 02           0024     MOV [OLDBP],BP
  25. 0013 8C 06 AB 02           0025     MOV [OLDES],ES
  26. 0017 89 3E A7 02           0026     MOV [OLDDI],DI
  27. 001B 89 36 A5 02           0027     MOV [OLDSI],SI    ;SAVE ALL REGISTERS
  28. 001F 89 16 A3 02           0028     MOV [OLDDX],DX
  29. 0023 89 0E A1 02           0029     MOV [OLDCX],CX
  30. 0027 89 1E 9F 02           0030     MOV [OLDBX],BX
  31. 002B A3 9D 02              0031     MOV [OLDAX],AX
  32. 002E 9C                    0032     PUSHF
  33. 002F 58                    0033     POP AX
  34. 0030 A3 9B 02              0034     MOV [OLDFLGS],AX
  35. 0033                       0035 
  36. 0033 A1 97 02              0036     MOV AX,[BIPC]  
  37. 0036 0B C0                 0037     OR AX,AX        ;CHECK IF ALREADY CONVERTED
  38. 0038 74 03                 0038     JZ FIXUP
  39. 003A E9 77 00              0039     JMP MAKPSP        ;ALREADY CONVERTED, SO JUST DO IT
  40. 003D                       0040 
  41. 003D                       0041 FIXUP:
  42. 003D BE 00 04              0042     MOV SI,FILEBEG
  43. 0040 8B D6                 0043     MOV DX,SI        ;SI POINTS AT EXE HEADER
  44. 0042 B1 04                 0044     MOV CL,4
  45. 0044 D3 CA                 0045     ROR DX,CL        ;DX CONTAINS NEW BASE SEGMENT
  46. 0046 81 E2 FF 0F           0046     AND DX,0FFFH
  47. 004A 8C C8                 0047     MOV AX,CS
  48. 004C 03 D0                 0048     ADD DX,AX
  49. 004E 03 54 08              0049     ADD DX,[SI+HDRSIZE]
  50. 0051 8B 4C 06              0050     MOV CX,[SI+ITEMCNT]    ;NUMBER OF SEGMENTS TO CONVERT
  51. 0054 8B 5C 18              0051     MOV BX,[SI+RELITEM]    ;BX POINTS AT ITEM TO CONVERT
  52. 0057 03 DE                 0052     ADD BX,SI 
  53. 0059                       0053 
  54. 0059 8B 44 16              0054     MOV AX,[SI+CODESEG]
  55. 005C 03 C2                 0055     ADD AX,DX
  56. 005E A3 B5 02              0056     MOV [WRKCS],AX
  57. 0061 A3 C3 02              0057     MOV [EXECS],AX
  58. 0064 8B 44 14              0058     MOV AX,[SI+CODEOFF]    ;SET FAR CALL ADDRESS
  59. 0067 A3 B3 02              0059     MOV [WRKIP],AX
  60. 006A A3 C1 02              0060     MOV [EXEIP],AX
  61. 006D                       0061 
  62. 006D B8 42 49              0062     MOV AX,4942H
  63. 0070 A3 97 02              0063     MOV [BIPC],AX        ;MARK THE HEADER
  64. 0073 B8 50 43              0064     MOV AX,4350H        ;CONVERT = NON-ZERO 
  65. 0076 A3 99 02              0065     MOV [BIPC2],AX    ;INDICATES IT IS CONVERTED
  66. 0079                       0066 
  67. 0079                       0067 MAKREL:
  68. 0079 C4 3F                 0068     LES DI,[BX]    ;MANGLE THE CODE TO GET THE 
  69. 007B 8C C0                 0069     MOV AX,ES    ;SEGMENT ADDRESSES RIGHT 
  70. 007D 03 C2                 0070     ADD AX,DX
  71. 007F 8E C0                 0071     MOV ES,AX 
  72. 0081 26                    0072     SEG ES
  73. 0082 01 15                 0073     ADD [DI],DX
  74. 0084 83 C3 04              0074     ADD BX,4
  75. 0087 E2 F0                 0075     LOOP MAKREL
  76. 0089                       0076 
  77. 0089 8B 44 02              0077     MOV AX,[SI+FILSIZE]    ;SAVE PROGRAM SIZE
  78. 008C A3 CD 02              0078     MOV [PRGSIZ],AX
  79. 008F                       0079 
  80. 008F 8B 44 0E              0080     MOV AX,[SI+STKSEG]
  81. 0092 03 C2                 0081     ADD AX,DX        ;CREATE THE STACK
  82. 0094 A3 B9 02              0082     MOV [WRKSS],AX        ;BASED ON THE EXE INFO
  83. 0097 A3 C7 02              0083     MOV [EXESS],AX
  84. 009A A3 BF 02              0084     MOV [BINSS],AX
  85. 009D 8B 44 10              0085     MOV AX,[SI+STKOFF]
  86. 00A0 A3 B7 02              0086     MOV [WRKSP],AX
  87. 00A3 A3 C5 02              0087     MOV [EXESP],AX
  88. 00A6 A3 BD 02              0088     MOV [BINBP],AX
  89. 00A9                       0089 
  90. 00A9 83 EA 10              0090     SUB DX,16
  91. 00AC 89 16 C9 02           0091     MOV [PSPSEG],DX        ;SAVE OUR PSP POINTER
  92. 00B0 89 16 BB 02           0092     MOV [BINDS],DX        ;WE WILL POINT DS THERE ON ENTRY
  93. 00B4                       0093 MAKPSP:
  94. 00B4 E8 A3 01              0094     CALL CHGCHK        ;CHECK FOR ENTRY ADR CHANGE
  95. 00B7 75 60                 0095     JNZ SKIPSP        ;WARM ENTRY, DON'T RE-CREATE PSP
  96. 00B9                       0096 
  97. 00B9 8B 16 C9 02           0097     MOV DX,[PSPSEG]        ;GET A COPY OF PSP IN DX
  98. 00BD 8B C2                 0098     MOV AX,DX        ;CLEAR THE PSP
  99. 00BF 2D 02 00              0099     SUB AX,2        ;PLUS 32 BYTES BELOW IT
  100. 00C2 8E D8                 0100     MOV DS,AX
  101. 00C4 33 DB                 0101     XOR BX,BX
  102. 00C6 B9 20 01              0102     MOV CX,256+16+16    ;CLEAR PSP, MCB, AND WORK AREA
  103. 00C9                       0103 CLRIT:
  104. 00C9 C6 07 00              0104     MOV B,[BX],0
  105. 00CC 43                    0105     INC BX
  106. 00CD E2 FA                 0106     LOOP CLRIT
  107. 00CF                       0107 
  108. 00CF 33 DB                 0108     XOR BX,BX
  109. 00D1 C7 07 97 02           0109     MOV [BX],DATATAB    ;STORE POINTER TO DATA TABLE
  110. 00D5 8C 4F 02              0110     MOV [BX+2],CS
  111. 00D8                       0111 
  112. 00D8 BB 10 00              0112     MOV BX,16
  113. 00DB C7 07 5A 00           0113     MOV [BX],5AH        ;DUMMY END MCB
  114. 00DF 89 57 01              0114     MOV [BX+1],DX        ;WE ARE THE OWNER
  115. 00E2 2E                    0115     SEG CS
  116. 00E3 A1 CD 02              0116     MOV AX,[PRGSIZ]
  117. 00E6 89 47 03              0117     MOV [BX+3],AX        ;HOW BIG IT IS
  118. 00E9                       0118 
  119. 00E9 8E DA                 0119     MOV DS,DX
  120. 00EB B9 0B 00              0120     MOV CX,11        ;CLEAR FCB1 & FCB2 AREA
  121. 00EE 33 DB                 0121     XOR BX,BX
  122. 00F0                       0122 CLRFCB1:
  123. 00F0 C6 47 5D 20           0123     MOV B,[BX+5DH],20H
  124. 00F4 C6 47 6D 20           0124     MOV B,[BX+6DH],20H
  125. 00F8 43                    0125     INC BX
  126. 00F9 E2 F5                 0126     LOOP CLRFCB1
  127. 00FB                       0127 
  128. 00FB B4 62                 0128     MOV AH,62H        ;GET CURRENT PSP SEG
  129. 00FD CD 21                 0129     INT 21H            ;IN BX
  130. 00FF B9 15 00              0130     MOV CX,15H        ;COPY BEG OF THIER PSP TO OURS
  131. 0102 33 F6                 0131     XOR SI,SI
  132. 0104 E8 46 01              0132     CALL CPYPSP
  133. 0107                       0133 
  134. 0107 2E                    0134     SEG CS
  135. 0108 A1 CD 02              0135     MOV AX,[PRGSIZ]    ;UPDATE THE END OF MEMORY
  136. 010B 8C C1                 0136     MOV CX,ES    ;FOR OUR PSP
  137. 010D 03 C1                 0137     ADD AX,CX    ;LAST SEG = LENGTH OF PRG + CS
  138. 010F 26                    0138     SEG ES
  139. 0110 A3 02 00              0139     MOV [2],AX
  140. 0113                       0140 
  141. 0113 26                    0141     SEG ES
  142. 0114 C6 06 80 00 1E        0142     MOV B,[80H],1EH    ;SET CMD LINE LENGTH BYTE
  143. 0119                       0143 
  144. 0119                       0144 SKIPSP:
  145. 0119 B4 62                 0145     MOV AH,62H        ;GET CURRENT PSP SEG
  146. 011B CD 21                 0146     INT 21H            ;IN BX
  147. 011D 2E                    0147     SEG CS
  148. 011E 89 1E CB 02           0148     MOV [OLDPSP],BX        ;SAVE CALLERS PSP
  149. 0122                       0149 
  150. 0122 B9 45 00              0150     MOV CX,45H        ;GET COPY OF CALLER'S ENV, 
  151. 0125 BE 16 00              0151     MOV SI,16H        ;HANDLE TABLE, AND PID.
  152. 0128 E8 22 01              0152     CALL CPYPSP
  153. 012B                       0153 
  154. 012B B4 50                 0154     MOV AH,50H
  155. 012D 2E                    0155     SEG CS
  156. 012E 8B 1E C9 02           0156     MOV BX,[PSPSEG]        ;SET DOS TO OUR OWN PSP
  157. 0132 CD 21                 0157     INT 21H
  158. 0134                       0158 
  159. 0134 BB 20 00              0159     MOV BX,20H
  160. 0137 BF CF 02              0160     MOV DI,OLD20    ;SWAP TERMINATE ADDRESS
  161. 013A B8 F7 01              0161     MOV AX,INTRET    ;WITH OUR OWN
  162. 013D E8 2B 01              0162     CALL SETINT
  163. 0140                       0163 
  164. 0140 BB 27 00              0164     MOV BX,27H
  165. 0143 BF D7 02              0165     MOV DI,OLD27    ;SWAP DOS TSR VECTOR
  166. 0146 B8 F7 01              0166     MOV AX,INTRET    ;WITH OUR OWN (SAME AS NORMAL EXIT)
  167. 0149 E8 1F 01              0167     CALL SETINT
  168. 014C                       0168 
  169. 014C BB 21 00              0169     MOV BX,21H
  170. 014F BF D3 02              0170     MOV DI,OLD21    ;SWAP DOS INT VECTOR
  171. 0152 B8 1F 02              0171     MOV AX,MYDOS    ;WITH OUR OWN
  172. 0155 E8 13 01              0172     CALL SETINT
  173. 0158                       0173 
  174. 0158 0E                    0174     PUSH CS
  175. 0159 1F                    0175     POP DS
  176. 015A 83 3E B9 02 00        0176     CMP W,[WRKSS],0        ;DON'T SWITCH IF ZERO
  177. 015F 74 0A                 0177     JZ NOSTACK
  178. 0161 FA                    0178     CLI
  179. 0162 8E 16 B9 02           0179     MOV SS,[WRKSS]        ;SWITCH THE STACK
  180. 0166 8B 26 B7 02           0180     MOV SP,[WRKSP]
  181. 016A FB                    0181     STI
  182. 016B                       0182 NOSTACK:
  183. 016B B8 85 01              0183     MOV AX,CFRET        ;SAVE OUR RETURN ADDRESS ON STACK
  184. 016E 0E                    0184     PUSH CS
  185. 016F 50                    0185     PUSH AX
  186. 0170 FF 36 B5 02           0186     PUSH [WRKCS]        ;PUSH EXE ENTRY ON STACK
  187. 0174 FF 36 B3 02           0187     PUSH [WRKIP]
  188. 0178 8B 2E BD 02           0188     MOV BP,[BINBP]        ;SET UP BP TO POINT AT WHERE-EVER
  189. 017C 8E 06 C9 02           0189     MOV ES,[PSPSEG]        ;SET UP ES TO POINT AT PSP
  190. 0180 8E 1E BB 02           0190     MOV DS,[BINDS]        ;SET UP DS TO POINT AT WHERE-EVER
  191. 0184 CB                    0191     RET L            ;ENTER THE EXE PRG VIA STACK
  192. 0185                       0192 
  193. 0185                       0193 ;---------------------------------------------------------------
  194. 0185                       0194 ; upon completion of the EXE program we return to here
  195. 0185                       0195 
  196. 0185                       0196 CFRET:
  197. 0185 2E                    0197     SEG CS        ;FAR CALL RETURN
  198. 0186 8C 1E BB 02           0198     MOV [BINDS],DS    ;SAVE CURRENT DS FOR RE-ENTRY
  199. 018A                       0199 WARMRET:
  200. 018A 2E                    0200     SEG CS        ;WARM START = ENTRY POINT WAS CHANGED
  201. 018B 8C 16 B9 02           0201     MOV [WRKSS],SS    ;USE THE CURRENT STACK FOR WARM RE-ENTRY
  202. 018F 2E                    0202     SEG CS
  203. 0190 89 26 B7 02           0203     MOV [WRKSP],SP
  204. 0194                       0204 DORET:
  205. 0194 2E                    0205     SEG CS
  206. 0195 89 2E BD 02           0206     MOV [BINBP],BP    ;ALSO SAVE BP
  207. 0199 2E                    0207     SEG CS
  208. 019A 8C 16 BF 02           0208     MOV [BINSS],SS    ;SAVE OUR STACK SEG TOO
  209. 019E                       0209 
  210. 019E BB 20 00              0210     MOV BX,20H
  211. 01A1 BF CF 02              0211     MOV DI,OLD20    ;RESTORE OLD INT 20H
  212. 01A4 E8 DD 00              0212     CALL CLRINT
  213. 01A7                       0213 
  214. 01A7 BB 21 00              0214     MOV BX,21H
  215. 01AA BF D3 02              0215     MOV DI,OLD21    ;RESTORE OLD INT 21H
  216. 01AD E8 D4 00              0216     CALL CLRINT
  217. 01B0                       0217 
  218. 01B0 BB 27 00              0218     MOV BX,27H
  219. 01B3 BF D7 02              0219     MOV DI,OLD27    ;RESTORE OLD INT 27H
  220. 01B6 E8 CB 00              0220     CALL CLRINT
  221. 01B9                       0221 
  222. 01B9 B4 50                 0222     MOV AH,50H
  223. 01BB 2E                    0223     SEG CS
  224. 01BC 8B 1E CB 02           0224     MOV BX,[OLDPSP]    ;RESTORE CALLERS PSP
  225. 01C0 CD 21                 0225     INT 21H
  226. 01C2                       0226 
  227. 01C2 0E                    0227     PUSH CS
  228. 01C3 1F                    0228     POP DS
  229. 01C4 FA                    0229     CLI
  230. 01C5 8E 16 B1 02           0230     MOV SS,[OLDSS]
  231. 01C9 8B 26 AF 02           0231     MOV SP,[OLDSP]
  232. 01CD FB                    0232     STI
  233. 01CE 8B 2E AD 02           0233     MOV BP,[OLDBP]
  234. 01D2 8E 06 AB 02           0234     MOV ES,[OLDES]
  235. 01D6 8B 3E A7 02           0235     MOV DI,[OLDDI]
  236. 01DA 8B 36 A5 02           0236     MOV SI,[OLDSI]    ;RESTORE ALL REGISTERS
  237. 01DE 8B 16 A3 02           0237     MOV DX,[OLDDX]
  238. 01E2 8B 0E A1 02           0238     MOV CX,[OLDCX]
  239. 01E6 8B 1E 9F 02           0239     MOV BX,[OLDBX]
  240. 01EA A1 9B 02              0240     MOV AX,[OLDFLGS] ;RESTORE FLAGS 
  241. 01ED 50                    0241     PUSH AX
  242. 01EE 9D                    0242     POPF
  243. 01EF A1 9D 02              0243     MOV AX,[OLDAX]
  244. 01F2 8E 1E A9 02           0244     MOV DS,[OLDDS]    ;RESTORE DS
  245. 01F6 CB                    0245     RET L        ;AND GO HOME
  246. 01F7                       0246 
  247. 01F7                       0247 INTRET:
  248. 01F7 2E                    0248     SEG CS
  249. 01F8 8C 1E BB 02           0249     MOV [BINDS],DS    ;SAVE CURRENT DS FOR RE-ENTRY
  250. 01FC 0E                    0250     PUSH CS
  251. 01FD 1F                    0251     POP DS
  252. 01FE E8 59 00              0252     CALL CHGCHK    ;CHECK FOR ENTRY ADR CHANGE
  253. 0201 75 87                 0253     JNZ WARMRET    ;WARM START IF CHANGED]
  254. 0203                       0254 
  255. 0203 A1 C9 02              0255     MOV AX,[PSPSEG]    ;IT WAS A COLD RETURN,
  256. 0206 A3 BB 02              0256     MOV [BINDS],AX    ;SO RESTORE ALL REGISTERS
  257. 0209 A1 C7 02              0257     MOV AX,[EXESS]    ;TO START UP CONDITION
  258. 020C A3 B9 02              0258     MOV [WRKSS],AX
  259. 020F A1 C5 02              0259     MOV AX,[EXESP]
  260. 0212 A3 B7 02              0260     MOV [WRKSP],AX
  261. 0215 E9 7C FF              0261     JMP DORET
  262. 0218                       0262 
  263. 0218                       0263 DOMEM:
  264. 0218 B8 08 00              0264     MOV AX,8
  265. 021B 33 DB                 0265     XOR BX,BX    ;TELL THEM THEY CAN'T ALLOCATE MEMORY
  266. 021D F9                    0266     STC
  267. 021E CF                    0267     IRET
  268. 021F                       0268 
  269. 021F                       0269 MYDOS:
  270. 021F 82 FC 00              0270     CMP AH,0    ;ZERO TERMINATE
  271. 0222 74 D3                 0271     JZ INTRET
  272. 0224 82 FC 4C              0272     CMP AH,4CH    ;ALTERNATE TERMINATE
  273. 0227 74 CE                 0273     JZ INTRET
  274. 0229 82 FC 31              0274     CMP AH,31H    ;TSR TERMINATE
  275. 022C 74 C9                 0275     JZ INTRET
  276. 022E 82 FC 48              0276     CMP AH,48H    ;ALLOC MEM
  277. 0231 74 E5                 0277     JZ DOMEM
  278. 0233 82 FC 49              0278     CMP AH,49H    ;FREE MEM
  279. 0236 74 E0                 0279     JZ DOMEM
  280. 0238 82 FC 4A              0280     CMP AH,4AH    ;MODIFY MEM
  281. 023B 74 DB                 0281     JZ DOMEM
  282. 023D 82 FC 4B              0282     CMP AH,4BH    ;LOAD AND EXEC
  283. 0240 74 D6                 0283     JZ DOMEM
  284. 0242                       0284 
  285. 0242 2E                    0285     SEG CS
  286. 0243 FF 36 D5 02           0286     PUSH [OLD21S]    ;PUSH OLD DOS ENTRY ON STACK
  287. 0247 2E                    0287     SEG CS
  288. 0248 FF 36 D3 02           0288     PUSH [OLD21]
  289. 024C CB                    0289     RET L        ;AND RETURN TO IT
  290. 024D                       0290 
  291. 024D                       0291 ;COPY ALL OR PART OF CALLER'S PSP
  292. 024D                       0292 ;NOTE THAT OUR PSP IS NOT A CHILD PSP, BUT RATHER 
  293. 024D                       0293 ;AN INDEPENDANT COPY OF THE PARENT PSP. 
  294. 024D                       0294 CPYPSP:
  295. 024D FC                    0295     CLD
  296. 024E 8E DB                 0296     MOV DS,BX
  297. 0250 2E                    0297     SEG CS
  298. 0251 8E 06 C9 02           0298     MOV ES,[PSPSEG]
  299. 0255 8B FE                 0299     MOV DI,SI
  300. 0257 F3                    0300     REP
  301. 0258 A4                    0301     MOVSB
  302. 0259 C3                    0302     RET
  303. 025A                       0303 
  304. 025A                       0304 ;CHECK IF ENTRY ADDRESS WAS CHANGED
  305. 025A                       0305 CHGCHK:
  306. 025A A1 B5 02              0306     MOV AX,[WRKCS]    ;IF THEY CHANGED THE ENTRY, THEN
  307. 025D 3B 06 C3 02           0307     CMP AX,[EXECS]    ;WE DO A WARM RESTART INSTEAD
  308. 0261 75 07                 0308     JNZ CHGRET
  309. 0263 A1 B3 02              0309     MOV AX,[WRKIP]
  310. 0266 3B 06 C1 02           0310     CMP AX,[EXEIP]
  311. 026A                       0311 CHGRET:
  312. 026A C3                    0312     RET
  313. 026B                       0313 
  314. 026B                       0314 ;SWAP INTERRUPT VECTOR
  315. 026B                       0315 SETINT:
  316. 026B 33 C9                 0316     XOR CX,CX    ;DS POINTS AT INT VECTORS
  317. 026D 8E D9                 0317     MOV DS,CX
  318. 026F 03 DB                 0318     ADD BX,BX    ;BX = INT NUMBER
  319. 0271 03 DB                 0319     ADD BX,BX
  320. 0273 C4 0F                 0320     LES CX,[BX]    ;GET CURRENT VALUE 
  321. 0275 2E                    0321     SEG CS
  322. 0276 89 0D                 0322     MOV [DI],CX    ;SAVE IT IN MEMORY  DI = SAVE ADDR
  323. 0278 2E                    0323     SEG CS
  324. 0279 8C 45 02              0324     MOV [DI+2],ES
  325. 027C FA                    0325     CLI
  326. 027D 89 07                 0326     MOV [BX],AX    ;SET NEW VALUE AX = OFFSET
  327. 027F 8C 4F 02              0327     MOV [BX+2],CS
  328. 0282 FB                    0328     STI
  329. 0283 C3                    0329     RET
  330. 0284                       0330 
  331. 0284                       0331 ;RESTORE INTERRUPT VECTOR
  332. 0284                       0332 CLRINT:
  333. 0284 33 C9                 0333     XOR CX,CX    ;DS POINTS AT INT VECTORS
  334. 0286 8E D9                 0334     MOV DS,CX
  335. 0288 03 DB                 0335     ADD BX,BX    ;BX = INT NUMBER
  336. 028A 03 DB                 0336     ADD BX,BX
  337. 028C 2E                    0337     SEG CS
  338. 028D C4 0D                 0338     LES CX,[DI]    ;RECOVER OLD VALUE FROM MEM
  339. 028F FA                    0339     CLI
  340. 0290 89 0F                 0340     MOV [BX],CX    ;RESTORE OLD VECTOR CX = OFFSET
  341. 0292 8C 47 02              0341     MOV [BX+2],ES    ;ES = SEGMENT
  342. 0295 FB                    0342     STI
  343. 0296 C3                    0343     RET
  344. 0297                       0344 
  345. 0297                       0345 ;*********************************************************
  346. 0297                       0346 ;THIS TABLE MUST REMAIN IN THIS ORDER FOR EXTERNAL ACCESS
  347. 0297                       0347 
  348. 0297                       0348 DATATAB EQU $
  349. 0297                       0349 
  350. 0297 00 00                 0350 BIPC    DW 0    ;LOADER ID
  351. 0299 00 00                 0351 BIPC2    DW 0    ;CONVERSION FLAG (0 = NOT CONVERTED)
  352. 029B 00 00                 0352 OLDFLGS    DW 0    ;CALLERS REGISTERS
  353. 029D 00 00                 0353 OLDAX    DW 0
  354. 029F 00 00                 0354 OLDBX    DW 0
  355. 02A1 00 00                 0355 OLDCX    DW 0
  356. 02A3 00 00                 0356 OLDDX    DW 0
  357. 02A5 00 00                 0357 OLDSI    DW 0
  358. 02A7 00 00                 0358 OLDDI    DW 0
  359. 02A9 00 00                 0359 OLDDS    DW 0
  360. 02AB 00 00                 0360 OLDES    DW 0
  361. 02AD 00 00                 0361 OLDBP    DW 0
  362. 02AF 00 00                 0362 OLDSP    DW 0    ;CALLERS STACK OFFSET
  363. 02B1 00 00                 0363 OLDSS    DW 0    ;CALLERS STACK SEGMENT
  364. 02B3 00 00                 0364 WRKIP    DW 0    ;POINTER TO CODE ENTRY 
  365. 02B5 00 00                 0365 WRKCS    DW 0
  366. 02B7 00 00                 0366 WRKSP    DW 0    ;OUR STACK OFFSET
  367. 02B9 00 00                 0367 WRKSS    DW 0    ;OUR STACK SEGMENT
  368. 02BB                       0368 
  369. 02BB 00 00                 0369 BINDS    DW 0    ;OUR OWN DS ON EXIT
  370. 02BD 00 00                 0370 BINBP    DW 0    ;OUR OWN BP ON EXIT
  371. 02BF 00 00                 0371 BINSS    DW 0    ;LAST KNOW STACK SEG
  372. 02C1 00 00                 0372 EXEIP    DW 0    ;ORIGINAL EXE ENTRY OFFSET
  373. 02C3 00 00                 0373 EXECS    DW 0    ;ORIGINAL EXE ENTRY SEGMENT
  374. 02C5 00 00                 0374 EXESP    DW 0    ;ORIGINAL EXE STACK OFFSET
  375. 02C7 00 00                 0375 EXESS    DW 0    ;ORIGINAL EXE STACK SEGMENT
  376. 02C9 00 00                 0376 PSPSEG    DW 0    ;OUR PSP SEG
  377. 02CB 00 00                 0377 OLDPSP    DW 0    ;PREV PSP SEG
  378. 02CD 00 00                 0378 PRGSIZ    DW 0    ;SIZE OF PROGRAM FILE IN PARAGRAPHS (SEG)
  379. 02CF                       0379 
  380. 02CF                       0380 
  381. 02CF                       0381 ;**********************************************************
  382. 02CF                       0382 ;END OF FIXED TABLE ACCESS
  383. 02CF                       0383 
  384. 02CF 00 00                 0384 OLD20    DW 0    ;PREV INT 20 OFFSET
  385. 02D1 00 00                 0385 OLD20S    DW 0    ;PREV INT 20 SEGMENT
  386. 02D3 00 00                 0386 OLD21    DW 0    ;PREV INT 21 OFFSET
  387. 02D5 00 00                 0387 OLD21S     DW 0    ;PREV INT 21 SEGMENT
  388. 02D7 00 00                 0388 OLD27    DW 0    ;PREV INT 27 OFFSET
  389. 02D9 00 00                 0389 OLD27S    DW 0    ;PREV INT 27 SEGMENT
  390. 02DB                       0390  
  391. 02DB                       0391 
  392. 02DB                       0392     DS 256+16+16    ;MINIMAL STORAGE AREA FOR PSP+MCB+MISC
  393. 03FB                       0393 PRGEND    EQU $        ;MINIMUM HEADER SIZE NEEDED 
  394. 03FB                       0394 
  395. 03FB                       0395 LAST    EQU 400H    ;MAKE THIS AT A SEGMENT BOUNDRY PAST PRGEND
  396. 03FB                       0396 
  397. 03FB                       0397 FILEBEG    EQU LAST    ;EXE IS LOADED AT SEGMENT BOUNDRY
  398. 03FB                       0398 
  399.  
  400.  
  401. Error Count =    0
  402.